package collection;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;

public class StreamAPIDemo2 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Random rd = new Random();
        for (int i = 0; i < 3; i++) {
            list.add(rd.nextInt(100));
        }
        System.out.println(list);
        /*
            找到集合中的最小值
            min方法返回一个Optional对象，表示集合中的最小值
            Optional有点像包装类，是将一个值包装为一个对象
         */
//        Optional<Integer> o = list.stream().min((e1, e2)->e1-e2);
        //最小值
        int numMin = list.stream().min((o1, o2)->o1-o2).get();
        System.out.println(numMin);

        //最大值
        int numMax = list.stream().max((o1,o2)->o1-o2).get();
        System.out.println(numMax);

        //查看集合中是否有偶数
        boolean anyMactch = list.stream().anyMatch(e->e%2==0);
        System.out.println("是否有偶数:"+anyMactch);

        //查看集合中是否所有元素都>50
        boolean allMacth = list.stream().allMatch(e->e>50);
        System.out.println("所有元素都>50:"+allMacth);

        //集合中所有元素是否都为奇数
        boolean noneMacth = list.stream().noneMatch(e->e%2==0);
        System.out.println("所有元素都是基数:"+noneMacth);

        /*
            reduce积累操作:先将集合前两个元素进行操作，将结果再与第三个元素进行操作，再将
            结果与第四个元素进行操作以此类推

            对集合求和
            list:[1,2,3,4,5,6,7,8,9]
            reduce((e1,e2)->e1+e2)

            第一次reduce:1和2操作:1+2
            list:[3,3,4,5,6,7,8,9]

            第二次reduce:3和3操作:3+3
            list:[6,4,5,6,7,8,9]

            第三次
            list:[10,5,6,7,8,9]
         */
//        o = list.stream().reduce((e1,e2)->e1+e2);
//        o = list.stream().reduce((e1,e2)->Integer.sum(e1,e2));
        //int num = list.stream().reduce((o1,o2)->o1+o2).get();
        int num = list.stream().reduce(Integer::sum).get();
        System.out.println(num);
    }
}
